home *** CD-ROM | disk | FTP | other *** search
- set -a
- #!/bin/sh
- # genscripts.sh - generate the ld-emulation-target specific files
- #
- # Usage: genscripts.sh srcdir libdir host_alias target_alias \
- # default_emulation this_emulation
- #
- # Sample usage:
- # genscripts.sh /djm/ld-devo/devo/ld /usr/local/lib sparc-sun-sunos4.1.3 \
- # sparc-sun-sunos4.1.3 sun4 sun3
- # produces sun3.x sun3.xbn sun3.xn sun3.xr sun3.xu em_sun3.c
-
- export srcdir=$1
- export libdir=$2
- export host_alias=$3
- export target_alias=$4
- export DEFAULT_EMULATION=$5
- export NATIVE_LIB_DIRS=$6
- export EMULATION_NAME=$7
-
- # Include the emulation-specific parameters:
- . ${srcdir}/emulparams/${EMULATION_NAME}.sh
-
- # Set the library search path, for libraries named by -lfoo.
- # If LIB_PATH is defined (e.g., by Makefile) and non-empty, it is used.
- # Otherwise, the default is set here.
- #
- # The format is the usual list of colon-separated directories.
- # To force a logically empty LIB_PATH, do LIBPATH=":".
-
- if [ "x${LIB_PATH}" = "x" ] ; then
- if [ "x${host_alias}" = "x${target_alias}" ] ; then
- # Native.
- LIB_PATH=/lib:/usr/lib
- if [ -n "${NATIVE_LIB_DIRS}" ]; then
- LIB_PATH=${LIB_PATH}:${NATIVE_LIB_DIRS}
- fi
- LIB_PATH=${LIB_PATH}:${libdir}
- if [ "${libdir}" != /usr/local/lib ] ; then
- LIB_PATH=${LIB_PATH}:/usr/local/lib
- fi
- else
- # Cross.
- LIB_PATH=
- fi
- fi
-
- # Always search $(tooldir)/lib, aka /usr/local/TARGET/lib.
- export LIB_PATH=${LIB_PATH}:`echo ${libdir} | sed -e s'|/lib$||'`/${target_alias}/lib
-
- export LIB_SEARCH_DIRS=`echo ${LIB_PATH} | tr ':' ' ' | sed -e 's/\([^ ][^ ]*\)/SEARCH_DIR(\1);/g'`
-
- # Generate 5 or 6 script files from a master script template in
- # ${srcdir}/scripttempl/${SCRIPT_NAME}.sh. Which one of the 5 or 6
- # script files is actually used depends on command line options given
- # to ld. (SCRIPT_NAME was set in the emulparams_file.)
- #
- # A .x script file is the default script.
- # A .xr script is for linking without relocation (-r flag).
- # A .xu script is like .xr, but *do* create constructors (-Ur flag).
- # A .xn script is for linking with -n flag (mix text and data on same page).
- # A .xbn script is for linking with -N flag (mix text and data on same page).
- # A .xs script is for generating a shared library with the --shared
- # flag; it is only generated if $GENERATE_SHLIB_SCRIPT is set by the
- # emulation parameters.
-
- export SEGMENT_SIZE=${SEGMENT_SIZE-${PAGE_SIZE}}
-
- # Determine DATA_ALIGNMENT for the 5 variants, using
- # values specified in the emulparams/<emulation>.sh file or default.
-
- export DATA_ALIGNMENT_="${DATA_ALIGNMENT_-${DATA_ALIGNMENT-ALIGN(${SEGMENT_SIZE})}}"
- export DATA_ALIGNMENT_n="${DATA_ALIGNMENT_n-${DATA_ALIGNMENT_}}"
- export DATA_ALIGNMENT_N="${DATA_ALIGNMENT_N-${DATA_ALIGNMENT-.}}"
- export DATA_ALIGNMENT_r="${DATA_ALIGNMENT_r-${DATA_ALIGNMENT-}}"
- export DATA_ALIGNMENT_u="${DATA_ALIGNMENT_u-${DATA_ALIGNMENT_r}}"
-
- export LD_FLAG=r
- export DATA_ALIGNMENT=${DATA_ALIGNMENT_r}
- export DEFAULT_DATA_ALIGNMENT="ALIGN(${SEGMENT_SIZE})"
- sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc | sed -e '/^ *$/d' > \
- ldscripts/${EMULATION_NAME}.xr
-
- export LD_FLAG=u
- export DATA_ALIGNMENT=${DATA_ALIGNMENT_u}
- export CONSTRUCTING=" "
- sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc | sed -e '/^ *$/d' > \
- ldscripts/${EMULATION_NAME}.xu
-
- export LD_FLAG=
- export DATA_ALIGNMENT=${DATA_ALIGNMENT_}
- export RELOCATING=" "
- sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc | sed -e '/^ *$/d' > \
- ldscripts/${EMULATION_NAME}.x
-
- export LD_FLAG=n
- export DATA_ALIGNMENT=${DATA_ALIGNMENT_n}
- export TEXT_START_ADDR=${NONPAGED_TEXT_START_ADDR-${TEXT_START_ADDR}}
- sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc | sed -e '/^ *$/d' > \
- ldscripts/${EMULATION_NAME}.xn
-
- export LD_FLAG=N
- export DATA_ALIGNMENT=${DATA_ALIGNMENT_N}
- sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc | sed -e '/^ *$/d' > \
- ldscripts/${EMULATION_NAME}.xbn
-
- if test -n "$GENERATE_SHLIB_SCRIPT"; then
- LD_FLAG=shared
- DATA_ALIGNMENT=${DATA_ALIGNMENT_s-${DATA_ALIGNMENT_}}
- CREATE_SHLIB=" "
- # Note that TEXT_START_ADDR is set to NONPAGED_TEXT_START_ADDR.
- sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc | sed -e '/^ *$/d' > \
- ldscripts/${EMULATION_NAME}.xs
- fi
-
- test "$DEFAULT_EMULATION" = "$EMULATION_NAME" && COMPILE_IN=true
-
- # Generate em_${EMULATION_NAME}.c.
- # This shell script emits a C file. -*- C -*-
- # It does some substitutions.
- cat >e${EMULATION_NAME}.c <<EOF
- /* This file is is generated by a shell script. DO NOT EDIT! */
-
- /* emulate the original gld for the given ${EMULATION_NAME}
- Copyright (C) 1991, 1993 Free Software Foundation, Inc.
- Written by Steve Chamberlain steve@cygnus.com
-
- This file is part of GLD, the Gnu Linker.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
-
- #define TARGET_IS_${EMULATION_NAME}
-
- #include "bfd.h"
- #include "sysdep.h"
- #include "bfdlink.h"
-
- #include "ld.h"
- #include "config.h"
- #include "ldmain.h"
- #include "ldemul.h"
- #include "ldfile.h"
- #include "ldmisc.h"
-
- static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
- static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
-
- static void
- gld${EMULATION_NAME}_before_parse()
- {
- #ifndef TARGET_ /* I.e., if not generic. */
- ldfile_output_architecture = bfd_arch_${ARCH};
- #endif /* not TARGET_ */
- }
-
- static char *
- gld${EMULATION_NAME}_get_script(isfile)
- int *isfile;
- EOF
-
- if test -n "$COMPILE_IN"
- then
- # Scripts compiled in.
-
- # sed commands to quote an ld script as a C string.
- sc="-f ${srcdir}/emultempl/stringify.sed"
-
- cat >>e${EMULATION_NAME}.c <<EOF
- {
- *isfile = 0;
-
- if (link_info.relocateable == true && config.build_constructors == true)
- return
- EOF
- sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
- echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
- sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
- echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
- sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
- echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
- sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
- echo ' ; else return' >> e${EMULATION_NAME}.c
- sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
- echo '; }' >> e${EMULATION_NAME}.c
-
- else
- # Scripts read from the filesystem.
-
- cat >>e${EMULATION_NAME}.c <<EOF
- {
- *isfile = 1;
-
- if (link_info.relocateable == true && config.build_constructors == true)
- return "ldscripts/${EMULATION_NAME}.xu";
- else if (link_info.relocateable == true)
- return "ldscripts/${EMULATION_NAME}.xr";
- else if (!config.text_read_only)
- return "ldscripts/${EMULATION_NAME}.xbn";
- else if (!config.magic_demand_paged)
- return "ldscripts/${EMULATION_NAME}.xn";
- else
- return "ldscripts/${EMULATION_NAME}.x";
- }
- EOF
-
- fi
-
- cat >>e${EMULATION_NAME}.c <<EOF
-
- struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
- {
- gld${EMULATION_NAME}_before_parse,
- syslib_default,
- hll_default,
- after_parse_default,
- after_allocation_default,
- set_output_arch_default,
- ldemul_default_target,
- before_allocation_default,
- gld${EMULATION_NAME}_get_script,
- "${EMULATION_NAME}",
- "${OUTPUT_FORMAT}"
- };
- EOF
-